﻿#pragma once
#include <QWidget>
#include <QLabel>
#include <QScrollArea>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>
#include <QList>
#include "Defs.h"
#include <QUuid>
#include "ThemeManager.h"

// 自定义标签项: 显示名称和行号,支持点击和悬浮效果, 被点击之后发送给PageService使CodeEditor滚动到对应行
class LabelItem : public QWidget
{
    Q_OBJECT
public:
    explicit LabelItem(const QString& name, int row, QWidget* parent = nullptr);
    explicit LabelItem(const QString& name, const QString& rowStr, QWidget* parent = nullptr);
    // 获取名称
    QString getName() const { return m_nameLabel->text(); }
    // 获取行号
    int getTimestampString() const { return m_rowLabel->text().toInt(); }
    // 设置名称
    void setName(const QString& name);
    // 设置行号
    void setRowNumber(int row);
    void setRowNumber(const QString& rowStr);
    QUuid getLabelId() const { return m_labelId; }
    void setLabelId(const QUuid& id) { m_labelId = id; }

    void setDarkTheme();
    void setLightTheme();
signals:
    // 点击项目时发出信号
    void clicked(int row);
    // 请求删除该标签
    void deleteRequested(const QUuid& labelId);
    void renameRequested(const QUuid& labelId, const QString& newName);
    void changeLineRequested(const QUuid& labelId, int newLine);
protected:
    // 重写鼠标事件实现点击效果
    void mousePressEvent(QMouseEvent* event) override;
    void contextMenuEvent(QContextMenuEvent* event) override;
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    void enterEvent(QEvent* event) override;
#else
    void enterEvent(QEnterEvent* event) override;
#endif
    void leaveEvent(QEvent* event) override;
    void paintEvent(QPaintEvent* event) override;  // 添加 paintEvent
private slots:
    void onRenameActionTriggered();
    void onChangeLineActionTriggered();

    void onThemeChanged(ThemeManager::Theme newTheme);
private:
    void setupUI();
	QString m_fullName; // 存储完整名称以便省略显示时使用
    QUuid m_labelId; // 存储标签ID(用于删除)
    QLabel* m_nameLabel;        // 名称标签
    QLabel* m_rowLabel;         // 行号标签(要滚动到的位置)
    QPushButton* m_deleteBtn;   // 删除按钮
    QHBoxLayout* m_mainLayout;  // 主布局
    bool m_isHovered;           // 悬浮状态
    // 右键菜单
    QMenu* m_contextMenu;
    QAction* m_renameAction;    // 重命名
    QAction* m_changeLineAction; // 修改行号
};

class LabelList : public QWidget
{
    Q_OBJECT
public:
    explicit LabelList(QWidget* parent = nullptr);
    // 添加项目
    void addItem(const QString& name, int row);
    void addItem(const QString& name, const QString& rowStr);
    void addItem(LabelItem* item);
    // 插入项目到指定位置
    void insertItem(int index, const QString& name, int row);
    void insertItem(int index, const QString& name, const QString& rowStr);
    void insertItem(int index, LabelItem* item);
    // 移除项目
    void removeItem(int index);
    void removeItem(LabelItem* item);
    void removeItemByName(const QString& name);
    // 清空所有项目
    void clear();
    // 获取项目数量
    int count() const { return m_items.count(); }
    // 获取指定项目
    LabelItem* itemAt(int index) const;
    // 查找项目
    int findItemByName(const QString& name) const;
signals:
    // 当某个项目被点击时发出信号
    void itemClicked(int row);
private slots:
    void onItemClicked(int row);

    void onThemeChanged(ThemeManager::Theme newTheme);
private:
    void setDarkTheme();
    void setLightTheme();
    void setupUI();
    QLabel* m_titleLabel;        // 添加标题标签
    QScrollArea* m_scrollArea;      // 滚动区域
    QWidget* m_containerWidget;     // 容器部件
    QVBoxLayout* m_containerLayout; // 容器布局
    QList<LabelItem*> m_items;      // 项目列表
};